remotes::install_github("sizespectrum/mizerExperimental")
list<-c("tidyverse", "mizerExperimental", "rfishbase")

lapply(list, require, character.only=T)

## create "not in" operator
'%nin%' = Negate('%in%')

decisions made while exploring:

read in simulated data

survObsBiom <- mskeyrun::simSurveyIndex #atlantisom::read_savedsurvs(d.name, 'survB')
#age_comp_data <- mskeyrun::simSurveyAgeLencomp #atlantisom::read_savedsurvs(d.name, 'survAge') #not using in assessment
len_comp_data <- mskeyrun::simSurveyLencomp #atlantisom::read_savedsurvs(d.name, 'survLen')
#wtage <- atlantisom::read_savedsurvs(d.name, 'survWtage')  #not using in assessment
annage_comp_data <- mskeyrun::simSurveyAgeLencomp #atlantisom::read_savedsurvs(d.name, 'survAnnAge')
annage_wtage <- mskeyrun::simSurveyWtatAge #atlantisom::read_savedsurvs(d.name, 'survAnnWtage')
params <- mskeyrun::simBiolPar
diet <- mskeyrun::simSurveyDietcomp 

#all_diets <- atlantisom::read_savedsurvs(d.name, 'survDiet') #not using in assessment

catchbio_ss <- mskeyrun::simCatchIndex #atlantisom::read_savedfisheries(d.name, 'Catch')
catchlen_ss <- mskeyrun::simFisheryLencomp #atlantisom::read_savedfisheries(d.name, "catchLen")
#fish_age_comp <- #atlantisom::read_savedfisheries(d.name, "catchAge")
fish_annage_comp <- mskeyrun::simFisheryAgecomp #atlantisom::read_savedfisheries(d.name, 'catchAnnAge')
fish_annage_wtage <- mskeyrun::simFisheryWtatAge #atlantisom::read_savedfisheries(d.name, 'catchAnnWtage')

formate for mizer

give species their latin names

sp_params <- data.frame(Name = c("Long_rough_dab",
             "Green_halibut",
             "Mackerel",
             "Haddock",
             "Saithe",
             "Redfish",
             "Blue_whiting",
             "Norwegian_ssh",
             "North_atl_cod",
             "Polar_cod",
             "Capelin"),
    latin = c("Hippoglossoides platessoides",
              "Reinhardtius hippoglossoides",
              "Scomber scombrus",
              "Melanogrammus aeglefinus",
              "Pollachius virens",
              "Sebastes mentella",
              "Micromesistius poutassou",
              "Clupea harengus",
              "Gadus morhua",
              "Boreogadus saida",
              "Mallotus villosus"))

add more species specific info

sp_params <- sp_params %>% left_join(params[,c("Name", "sigma")])
Error in `[.data.frame`(params, , c("Name", "sigma")) : 
  undefined columns selected

get weight at maturity from fishbase

## get mean maturity 
maturity_tbl <- rfishbase::maturity(sp_params$latin)
Joining with `by = join_by(SpecCode)`
## get average for now (can select median, by sex, by location ect)
mean_maturity <- maturity_tbl |>
    group_by(Species) |>
    summarise(age_mat = mean(tm, na.rm = T),
              l_mat = mean(Lm, na.rm = T))

# ## get mean population growth
# popgrowth_tbl <- rfishbase::popgrowth(sp_params$latin)
# popgrowth_tbl <- unique(popgrowth_tbl %>%
#     group_by(Species) %>%
#     summarise(k_vb = median(K)))

sp_params <- sp_params %>% left_join(mean_maturity, by = c("latin" = "Species"))
#sp_params <- sp_params %>% left_join(popgrowth_tbl, by = c("latin" = "Species"))

## calculate w_mat from l_mat
sp_params <-  sp_params %>% 
    mutate(w_mat = a * l_mat ^ b) 

## need age weight relationship for Boreogadus saida who does not have a l_mat
sp_params$w_mat[sp_params$latin == "Boreogadus saida"] <- sp_params$w_max[sp_params$latin == "Boreogadus saida"]*0.25

# ## calculate h 
# sp_params$h <- get_h_default(sp_params)

create generic interaction matrix (use the diet data for this?)

# make a dummy species interaction matrix of full interaction with everything
sp_matrix <- as.data.frame(matrix(rep(1, length(unique(sp_params$species))^2), nrow = (length(unique(sp_params$species))),
                                  dimnames = list(unique(sp_params$species), unique(sp_params$species))))

build mizer model

t <- newMultispeciesParams(species_params = sp_params,
                              #     gear_params = sp_gear,
                                   interaction = sp_matrix, 
                                   initial_effort = 1,
                                   lambda = 2.05, n = 3/4, p = 3/4)
For the species Redfish the value for `w_mat` is not smaller than that of `w_max`. I have corrected that by setting it to about 25% of `w_mat.
Warning: For the following species your value for w_mat and your value for l_mat are not consistent: RedfishWarning: For the following species your value for w_mat and your value for l_mat are not consistent: RedfishWarning: For the following species your value for w_mat and your value for l_mat are not consistent: RedfishNo ks column so calculating from critical feeding level.
Using z0 = z0pre * w_max ^ z0exp for missing z0 values.
Using f0, h, lambda, kappa and the predation kernel to calculate gamma.

run to steady state

ta <- steady(t)
Convergence was achieved in 16.5 years.

calibrate to observed biomass

tb <- calibrateBiomass(ta)
tc <- matchBiomasses(tb)
Warning: For the following species `erepro` has been increased to the smallest possible value: erepro[Green_halibut] = 0.000829; erepro[Saithe] = 0.000417; erepro[Blue_whiting] = 0.00369; erepro[North_atl_cod] = 0.000386; erepro[Polar_cod] = 0.00441; erepro[Capelin] = 0.00497

check plots

plotlySpectra(tc, power = 1, total = T)
plotlySpectra(tc, power = 2, total = T)
plotBiomassVsSpecies(tc)

run to steady state again

td <- tc |>
    calibrateBiomass() |> matchBiomasses() |> matchGrowth() |> steady() |>
    calibrateBiomass() |> matchBiomasses() |> matchGrowth() |> steady() |>
    calibrateBiomass() |> matchBiomasses() |> matchGrowth() |> steady() |>
    calibrateBiomass() |> matchBiomasses() |> matchGrowth() |> steady() |>
    calibrateBiomass() |> matchBiomasses() |> matchGrowth() |> steady() 
Warning: For the following species `erepro` has been increased to the smallest possible value: erepro[Green_halibut] = 0.000829; erepro[Saithe] = 0.000417; erepro[Capelin] = 0.00497Warning: For the following species `erepro` has been increased to the smallest possible value: erepro[Long_rough_dab] = 3.24; erepro[Green_halibut] = 2.39; erepro[Redfish] = 10600; erepro[Blue_whiting] = 0.00551; erepro[Norwegian_ssh] = 0.00387; erepro[Polar_cod] = 0.0873; erepro[Capelin] = 0.055Convergence was achieved in 12 years.
Warning: The following species require an unrealistic reproductive efficiency greater than 1: Long_rough_dab, Green_halibut, RedfishWarning: For the following species `erepro` has been increased to the smallest possible value: erepro[Long_rough_dab] = 20; erepro[Green_halibut] = 13.1; erepro[Redfish] = 61900; erepro[Norwegian_ssh] = 0.012; erepro[North_atl_cod] = 0.000934Convergence was achieved in 16.5 years.
Warning: The following species require an unrealistic reproductive efficiency greater than 1: Long_rough_dab, Green_halibut, RedfishConvergence was achieved in 10.5 years.
Warning: The following species require an unrealistic reproductive efficiency greater than 1: Long_rough_dab, Green_halibut, RedfishConvergence was achieved in 9 years.
Warning: The following species require an unrealistic reproductive efficiency greater than 1: Long_rough_dab, Green_halibut, RedfishConvergence was achieved in 4.5 years.
Warning: The following species require an unrealistic reproductive efficiency greater than 1: Long_rough_dab, Green_halibut, Redfish
summary(td)
An object of class "MizerParams" 
Consumer size spectrum:
    minimum size:   0.001
    maximum size:   25374.6
    no. size bins:  100
Resource size spectrum:
    minimum size:   8.91616e-13
    maximum size:   9.20389
    no. size bins:  175 (221 size bins in total)
Species details:

Fishing gear details:
Gear          Effort  Target species 
 ----------------------------------
knife_edge_gear 1.00   Long_rough_dab, Green_halibut, Mackerel, Haddock, Saithe, Redfish, Blue_whiting, Norwegian_ssh, North_atl_cod, Polar_cod, Capelin 
View(td@species_params)

look at plots

plotBiomassVsSpecies(tb)
plotBiomassVsSpecies(td)
plotlySpectra(tb, power = 1, total = T)
plotlySpectra(tc, power = 1, total = T)
plotlySpectra(td, power = 1, total = T)
plotlySpectra(td, power = 2, total = T)
sim <- steady(td, return_sim = TRUE, t_max = 12, t_per = 0.2)
Convergence was achieved in 0.2 years.
plot(sim)

sim <- steady(td, return_sim = TRUE, t_max = 12, t_per = 0.2)
Convergence was achieved in 0.2 years.
Warning: The following species require an unrealistic reproductive efficiency greater than 1: Long_rough_dab, Green_halibut, Redfish
plot(sim)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3Igc2V0IHVwfQpyZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigic2l6ZXNwZWN0cnVtL21pemVyRXhwZXJpbWVudGFsIikKbGlzdDwtYygidGlkeXZlcnNlIiwgIm1pemVyRXhwZXJpbWVudGFsIiwgInJmaXNoYmFzZSIpCgpsYXBwbHkobGlzdCwgcmVxdWlyZSwgY2hhcmFjdGVyLm9ubHk9VCkKCiMjIGNyZWF0ZSAibm90IGluIiBvcGVyYXRvcgonJW5pbiUnID0gTmVnYXRlKCclaW4lJykKYGBgCgoKIyMgZGVjaXNpb25zIG1hZGUgd2hpbGUgZXhwbG9yaW5nOgotIHVzZSBmYWxsIGJpb21hc3MKLSB0YWtlIGEgMTQgeWVhciBhdmVyYWdlIG9mIHN1cnZleSBvYnNlcnZlZCBiaW9tYXNzIGZyb20gc3RhcnQgb2YgdGhlIHRpbWUgc2VyaWVzICh0aGUgbm9uLWZpc2hlZCB5ZWFycykKCiMjIHJlYWQgaW4gc2ltdWxhdGVkIGRhdGEKYGBge3J9CnN1cnZPYnNCaW9tIDwtIG1za2V5cnVuOjpzaW1TdXJ2ZXlJbmRleCAjYXRsYW50aXNvbTo6cmVhZF9zYXZlZHN1cnZzKGQubmFtZSwgJ3N1cnZCJykKI2FnZV9jb21wX2RhdGEgPC0gbXNrZXlydW46OnNpbVN1cnZleUFnZUxlbmNvbXAgI2F0bGFudGlzb206OnJlYWRfc2F2ZWRzdXJ2cyhkLm5hbWUsICdzdXJ2QWdlJykgI25vdCB1c2luZyBpbiBhc3Nlc3NtZW50Cmxlbl9jb21wX2RhdGEgPC0gbXNrZXlydW46OnNpbVN1cnZleUxlbmNvbXAgI2F0bGFudGlzb206OnJlYWRfc2F2ZWRzdXJ2cyhkLm5hbWUsICdzdXJ2TGVuJykKI3d0YWdlIDwtIGF0bGFudGlzb206OnJlYWRfc2F2ZWRzdXJ2cyhkLm5hbWUsICdzdXJ2V3RhZ2UnKSAgI25vdCB1c2luZyBpbiBhc3Nlc3NtZW50CmFubmFnZV9jb21wX2RhdGEgPC0gbXNrZXlydW46OnNpbVN1cnZleUFnZUxlbmNvbXAgI2F0bGFudGlzb206OnJlYWRfc2F2ZWRzdXJ2cyhkLm5hbWUsICdzdXJ2QW5uQWdlJykKYW5uYWdlX3d0YWdlIDwtIG1za2V5cnVuOjpzaW1TdXJ2ZXlXdGF0QWdlICNhdGxhbnRpc29tOjpyZWFkX3NhdmVkc3VydnMoZC5uYW1lLCAnc3VydkFubld0YWdlJykKcGFyYW1zIDwtIG1za2V5cnVuOjpzaW1CaW9sUGFyCmRpZXQgPC0gbXNrZXlydW46OnNpbVN1cnZleURpZXRjb21wIAoKI2FsbF9kaWV0cyA8LSBhdGxhbnRpc29tOjpyZWFkX3NhdmVkc3VydnMoZC5uYW1lLCAnc3VydkRpZXQnKSAjbm90IHVzaW5nIGluIGFzc2Vzc21lbnQKCmNhdGNoYmlvX3NzIDwtIG1za2V5cnVuOjpzaW1DYXRjaEluZGV4ICNhdGxhbnRpc29tOjpyZWFkX3NhdmVkZmlzaGVyaWVzKGQubmFtZSwgJ0NhdGNoJykKY2F0Y2hsZW5fc3MgPC0gbXNrZXlydW46OnNpbUZpc2hlcnlMZW5jb21wICNhdGxhbnRpc29tOjpyZWFkX3NhdmVkZmlzaGVyaWVzKGQubmFtZSwgImNhdGNoTGVuIikKI2Zpc2hfYWdlX2NvbXAgPC0gI2F0bGFudGlzb206OnJlYWRfc2F2ZWRmaXNoZXJpZXMoZC5uYW1lLCAiY2F0Y2hBZ2UiKQpmaXNoX2FubmFnZV9jb21wIDwtIG1za2V5cnVuOjpzaW1GaXNoZXJ5QWdlY29tcCAjYXRsYW50aXNvbTo6cmVhZF9zYXZlZGZpc2hlcmllcyhkLm5hbWUsICdjYXRjaEFubkFnZScpCmZpc2hfYW5uYWdlX3d0YWdlIDwtIG1za2V5cnVuOjpzaW1GaXNoZXJ5V3RhdEFnZSAjYXRsYW50aXNvbTo6cmVhZF9zYXZlZGZpc2hlcmllcyhkLm5hbWUsICdjYXRjaEFubld0YWdlJykKYGBgCgojIyBmb3JtYXRlIGZvciBtaXplcgoKIyMgZ2l2ZSBzcGVjaWVzIHRoZWlyIGxhdGluIG5hbWVzCmBgYHtyfQpzcF9wYXJhbXMgPC0gZGF0YS5mcmFtZShOYW1lID0gYygiTG9uZ19yb3VnaF9kYWIiLAogICAgICAgICAgICAgIkdyZWVuX2hhbGlidXQiLAogICAgICAgICAgICAgIk1hY2tlcmVsIiwKICAgICAgICAgICAgICJIYWRkb2NrIiwKICAgICAgICAgICAgICJTYWl0aGUiLAogICAgICAgICAgICAgIlJlZGZpc2giLAogICAgICAgICAgICAgIkJsdWVfd2hpdGluZyIsCiAgICAgICAgICAgICAiTm9yd2VnaWFuX3NzaCIsCiAgICAgICAgICAgICAiTm9ydGhfYXRsX2NvZCIsCiAgICAgICAgICAgICAiUG9sYXJfY29kIiwKICAgICAgICAgICAgICJDYXBlbGluIiksCiAgICBsYXRpbiA9IGMoIkhpcHBvZ2xvc3NvaWRlcyBwbGF0ZXNzb2lkZXMiLAogICAgICAgICAgICAgICJSZWluaGFyZHRpdXMgaGlwcG9nbG9zc29pZGVzIiwKICAgICAgICAgICAgICAiU2NvbWJlciBzY29tYnJ1cyIsCiAgICAgICAgICAgICAgIk1lbGFub2dyYW1tdXMgYWVnbGVmaW51cyIsCiAgICAgICAgICAgICAgIlBvbGxhY2hpdXMgdmlyZW5zIiwKICAgICAgICAgICAgICAiU2ViYXN0ZXMgbWVudGVsbGEiLAogICAgICAgICAgICAgICJNaWNyb21lc2lzdGl1cyBwb3V0YXNzb3UiLAogICAgICAgICAgICAgICJDbHVwZWEgaGFyZW5ndXMiLAogICAgICAgICAgICAgICJHYWR1cyBtb3JodWEiLAogICAgICAgICAgICAgICJCb3Jlb2dhZHVzIHNhaWRhIiwKICAgICAgICAgICAgICAiTWFsbG90dXMgdmlsbG9zdXMiKSkKYGBgCgojIyBhZGQgbW9yZSBzcGVjaWVzIHNwZWNpZmljIGluZm8KYGBge3J9CiMjIG1heCB3ZWlnaHQgY2F1Z2h0IGluIChzaW11bGF0ZWQpIHN5c3RlbSAKc3BfcGFyYW1zIDwtIHNwX3BhcmFtcyAlPiUgbGVmdF9qb2luKGFubmFnZV93dGFnZSAlPiUgZ3JvdXBfYnkoTmFtZSkgJT4lIHN1bW1hcmlzZSh3X21heCA9IG1heCh2YWx1ZSkpKQoKIyMgb2JzZXJ2ZWQgKHNpbXVsYXRlZCkgYmlvbWFzcyB1bmRlciBubyBmaXNoaW5nCnNwX3BhcmFtcyA8LSBzcF9wYXJhbXMgJT4lIGxlZnRfam9pbihzdXJ2T2JzQmlvbVtzdXJ2T2JzQmlvbSR5ZWFyICVpbiUgNDA6NTQsXSAlPiUgZ3JvdXBfYnkoTmFtZSkgJT4lIHN1bW1hcmlzZShiaW9tYXNzX29ic2VydmVkID0gbWVhbih2YWx1ZSkpKQoKIyMgYSBhbmQgYiBmYWN0b3JzCnNwX3BhcmFtcyA8LSBzcF9wYXJhbXMgJT4lIGxlZnRfam9pbihwYXJhbXNbLCBjKCJOYW1lIiwgIldMYSIsICJXTGIiKV0pCm5hbWVzKHNwX3BhcmFtcykgPC0gYygic3BlY2llcyIsICJsYXRpbiIsICJ3X21heCIsICJiaW9tYXNzX29ic2VydmVkIiwgImEiLCAiYiIpCgojIyBnZXQgcHJlZC9wcmV5IHJhdGlvIGZyb20gQmFybnMgZXQgYWwgMjAxMSBodHRwczovL2RvaS5vcmcvMTAuMTg5MC8wNy0xNTUxLjEKc3BfcGFyYW1zJGJldGEgPC0gc3BfcGFyYW1zJHdfbWF4LyAjIyBwcmVkYXRvciBtYXNzCiAgMTBeKC0yLjMgKyAyLjUqbG9nMTAoc3BfcGFyYW1zJHdfbWF4KSAtIDAuMzYqbG9nMTAoc3BfcGFyYW1zJHdfbWF4KV4yKSAjIyBwcmV5IG1hc3MKCiMjIGFkZCBkaWV0IGJyZWFkdGgKc3BfcGFyYW1zIDwtIHNwX3BhcmFtcyAlPiUgbGVmdF9qb2luKHBhcmFtc1ssYygiTmFtZSIsICJzaWdtYSIpXSkKCiMjIGdldCBzaXplIGFkanVzdGVkIGdyb3d0aCBwYXJhbWV0ZXIgKGN1cnJlbnRseSB1c2luZyBhdmVyYWdlKQpzcF9wYXJhbXMkaCA8LSAyMgoKYGBgCgojIyBnZXQgd2VpZ2h0IGF0IG1hdHVyaXR5IGZyb20gZmlzaGJhc2UKYGBge3J9CiMjIGdldCBtZWFuIG1hdHVyaXR5IAptYXR1cml0eV90YmwgPC0gcmZpc2hiYXNlOjptYXR1cml0eShzcF9wYXJhbXMkbGF0aW4pCgojIyBnZXQgYXZlcmFnZSBmb3Igbm93IChjYW4gc2VsZWN0IG1lZGlhbiwgYnkgc2V4LCBieSBsb2NhdGlvbiBlY3QpCm1lYW5fbWF0dXJpdHkgPC0gbWF0dXJpdHlfdGJsIHw+CiAgICBncm91cF9ieShTcGVjaWVzKSB8PgogICAgc3VtbWFyaXNlKGFnZV9tYXQgPSBtZWFuKHRtLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIGxfbWF0ID0gbWVhbihMbSwgbmEucm0gPSBUKSkKCiMgIyMgZ2V0IG1lYW4gcG9wdWxhdGlvbiBncm93dGgKIyBwb3Bncm93dGhfdGJsIDwtIHJmaXNoYmFzZTo6cG9wZ3Jvd3RoKHNwX3BhcmFtcyRsYXRpbikKIyBwb3Bncm93dGhfdGJsIDwtIHVuaXF1ZShwb3Bncm93dGhfdGJsICU+JQojICAgICBncm91cF9ieShTcGVjaWVzKSAlPiUKIyAgICAgc3VtbWFyaXNlKGtfdmIgPSBtZWRpYW4oSykpKQoKc3BfcGFyYW1zIDwtIHNwX3BhcmFtcyAlPiUgbGVmdF9qb2luKG1lYW5fbWF0dXJpdHksIGJ5ID0gYygibGF0aW4iID0gIlNwZWNpZXMiKSkKI3NwX3BhcmFtcyA8LSBzcF9wYXJhbXMgJT4lIGxlZnRfam9pbihwb3Bncm93dGhfdGJsLCBieSA9IGMoImxhdGluIiA9ICJTcGVjaWVzIikpCgojIyBjYWxjdWxhdGUgd19tYXQgZnJvbSBsX21hdApzcF9wYXJhbXMgPC0gIHNwX3BhcmFtcyAlPiUgCiAgICBtdXRhdGUod19tYXQgPSBhICogbF9tYXQgXiBiKSAKCiMjIG5lZWQgYWdlIHdlaWdodCByZWxhdGlvbnNoaXAgZm9yIEJvcmVvZ2FkdXMgc2FpZGEgd2hvIGRvZXMgbm90IGhhdmUgYSBsX21hdApzcF9wYXJhbXMkd19tYXRbc3BfcGFyYW1zJGxhdGluID09ICJCb3Jlb2dhZHVzIHNhaWRhIl0gPC0gc3BfcGFyYW1zJHdfbWF4W3NwX3BhcmFtcyRsYXRpbiA9PSAiQm9yZW9nYWR1cyBzYWlkYSJdKjAuMjUKCiMgIyMgY2FsY3VsYXRlIGggCiMgc3BfcGFyYW1zJGggPC0gZ2V0X2hfZGVmYXVsdChzcF9wYXJhbXMpCgpgYGAKCiMjIGNyZWF0ZSBnZW5lcmljIGludGVyYWN0aW9uIG1hdHJpeCAodXNlIHRoZSBkaWV0IGRhdGEgZm9yIHRoaXM/KQpgYGB7cn0KIyBtYWtlIGEgZHVtbXkgc3BlY2llcyBpbnRlcmFjdGlvbiBtYXRyaXggb2YgZnVsbCBpbnRlcmFjdGlvbiB3aXRoIGV2ZXJ5dGhpbmcKc3BfbWF0cml4IDwtIGFzLmRhdGEuZnJhbWUobWF0cml4KHJlcCgxLCBsZW5ndGgodW5pcXVlKHNwX3BhcmFtcyRzcGVjaWVzKSleMiksIG5yb3cgPSAobGVuZ3RoKHVuaXF1ZShzcF9wYXJhbXMkc3BlY2llcykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbW5hbWVzID0gbGlzdCh1bmlxdWUoc3BfcGFyYW1zJHNwZWNpZXMpLCB1bmlxdWUoc3BfcGFyYW1zJHNwZWNpZXMpKSkpCmBgYAoKIyMgYnVpbGQgbWl6ZXIgbW9kZWwKYGBge3J9CnQgPC0gbmV3TXVsdGlzcGVjaWVzUGFyYW1zKHNwZWNpZXNfcGFyYW1zID0gc3BfcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICBnZWFyX3BhcmFtcyA9IHNwX2dlYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb24gPSBzcF9tYXRyaXgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfZWZmb3J0ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgPSAyLjA1LCBuID0gMy80LCBwID0gMy80KQpgYGAKCgojIyBydW4gdG8gc3RlYWR5IHN0YXRlCmBgYHtyfQp0YSA8LSBzdGVhZHkodCkKYGBgCgojIyBjYWxpYnJhdGUgdG8gb2JzZXJ2ZWQgYmlvbWFzcwpgYGB7cn0KdGIgPC0gY2FsaWJyYXRlQmlvbWFzcyh0YSkKdGMgPC0gbWF0Y2hCaW9tYXNzZXModGIpCmBgYAoKIyMgY2hlY2sgcGxvdHMKYGBge3J9CnBsb3RseVNwZWN0cmEodGMsIHBvd2VyID0gMSwgdG90YWwgPSBUKQpwbG90bHlTcGVjdHJhKHRjLCBwb3dlciA9IDIsIHRvdGFsID0gVCkKcGxvdEJpb21hc3NWc1NwZWNpZXModGMpCmBgYAoKIyMgcnVuIHRvIHN0ZWFkeSBzdGF0ZSBhZ2FpbgpgYGB7cn0KdGQgPC0gdGMgfD4KICAgIGNhbGlicmF0ZUJpb21hc3MoKSB8PiBtYXRjaEJpb21hc3NlcygpIHw+IG1hdGNoR3Jvd3RoKCkgfD4gc3RlYWR5KCkgfD4KICAgIGNhbGlicmF0ZUJpb21hc3MoKSB8PiBtYXRjaEJpb21hc3NlcygpIHw+IG1hdGNoR3Jvd3RoKCkgfD4gc3RlYWR5KCkgfD4KICAgIGNhbGlicmF0ZUJpb21hc3MoKSB8PiBtYXRjaEJpb21hc3NlcygpIHw+IG1hdGNoR3Jvd3RoKCkgfD4gc3RlYWR5KCkgfD4KICAgIGNhbGlicmF0ZUJpb21hc3MoKSB8PiBtYXRjaEJpb21hc3NlcygpIHw+IG1hdGNoR3Jvd3RoKCkgfD4gc3RlYWR5KCkgfD4KICAgIGNhbGlicmF0ZUJpb21hc3MoKSB8PiBtYXRjaEJpb21hc3NlcygpIHw+IG1hdGNoR3Jvd3RoKCkgfD4gc3RlYWR5KCkgCmBgYAoKCgpgYGB7cn0Kc3VtbWFyeSh0ZCkKVmlldyh0ZEBzcGVjaWVzX3BhcmFtcykKYGBgCgojIyBsb29rIGF0IHBsb3RzCmBgYHtyfQpwbG90QmlvbWFzc1ZzU3BlY2llcyh0YikKcGxvdEJpb21hc3NWc1NwZWNpZXModGQpCmBgYAoKCmBgYHtyfQpwbG90bHlTcGVjdHJhKHRiLCBwb3dlciA9IDEsIHRvdGFsID0gVCkKcGxvdGx5U3BlY3RyYSh0YywgcG93ZXIgPSAxLCB0b3RhbCA9IFQpCnBsb3RseVNwZWN0cmEodGQsIHBvd2VyID0gMSwgdG90YWwgPSBUKQpwbG90bHlTcGVjdHJhKHRkLCBwb3dlciA9IDIsIHRvdGFsID0gVCkKYGBgCgpgYGB7cn0Kc2ltIDwtIHN0ZWFkeSh0ZCwgcmV0dXJuX3NpbSA9IFRSVUUsIHRfbWF4ID0gMTIsIHRfcGVyID0gMC4yKQpwbG90KHNpbSkKYGBgCgoKCgoKCgoKCgoK